package com.cskaoyan.javse.oop3._2inner._0introduction;

/**
 * @description: 内部类的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 引入
 * > 我们现在做一个应用程序，需要描述一台电脑（Computer）中的CPU，对于电脑而言
 * > 该怎么去描述这个CPU呢？
 * - 它有存储设备，IO设备等等很多硬件资源组件
 * - CPU是电脑中最重要的组件
 *
 * CPU也应该定义成一个类，叫做CPU类,然后在Computer类中定义私有的CPU对象的成员变量
 * 这样做是可以的,但是也有一些问题:
 *      1.CPU很重要,应该严格保护在内部,并且CPU也不能脱离计算机存在,CPU对象应该只存在于计算机内部,在外部不应该能够创建CPU对象
 *      2.CPU还很强大,CPU可以控制计算机的一切硬件资源,CPU对象应该可以访问Computer类的所有成员(不管是否私有)
 *
 * 以上两个需求,定义普通类CPU是不能完成的,需要定义内部类CPU ---> 不再将CPU类定义为一个独立的类,而是将它放入Computer类的类体中,可以近似的看成是一个Computer类的成员 ---> CPU类近似看成Computer类的成员
 *
 * 类的成员就不再仅有两个访问权限,就有了四个访问权限,内部类就可以私有化了,在外界就无法创建它的对象了,并且由于成为了类的成员,内部类就可以访问包裹它的类的所有成员,包括私有.
 *  所以,我们通过上面的案例,总结一下内部类的两个用途:
 *      1.内部类是一种比类更加极致的封装思想体现,内部类的成员不仅被类自身保护,还被包裹着它的类保护
 *      2.内部类和包裹它的类互相成为了"好兄弟",互相访问成员都不受访问权限限制
 *
 * 内部类的定义
 *  在Java语言中类可以嵌套定义，内部类（inner class）是定义在另一类当中的类
 *
 * > 内部类的概述
 * - 按照内部类在类中定义的位置不同：
 *   - 定义在成员位置的内部类，称之为成员内部类，普通成员内部类，静态内部类
 *   - 定义在局部位置的内部类:
 *          局部内部类，在局部内部类基础上发展而来的匿名内部类,还有在匿名内部类基础上发展而来的lambda表达式
 *
 * - 内部类是典型的，Java从C++中拿过来但是没有经过简化的特性
 *   - 也就是说Java几乎照搬了C++中的内部类
 *   - 通过内部类可以稍微感受一下C++的语法复杂性
 *
 * - 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定
 *   - 像CPU这种类我们称之为内部类（inner class）
 *   - Computer这种类我们称之为外围类（enclosed class）
 *   - Demo这种类我们称之为外部类/其他类（outside class）
 *
 */
public class Demo {
    public static void main(String[] args) {
        //CPU cpu = new CPU();
    }
}
class Computer{
    //计算机中存在CPU
    private CPU cpu;

    //内部类有私有的概念,私有的内部类在外界无法创建对象,
    //只能在包裹它的类中创建对象(自己类中肯定也能创建对象)
    private class CPU {
        //属性+行为
    }
}
//class CPU{
//    //属性+行为
//}